package com.ltcode.sys.interfaces.converter;

import com.ltcode.sys.domain.model.SysDept;
import com.ltcode.sys.interfaces.dto.SysDeptDTO;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 部门DTO转换器
 * 
 * @author ltcode
 * @since 2024-01-01
 */
public class SysDeptDTOConverter {

    /**
     * 领域模型转换为DTO
     */
    public static SysDeptDTO toDTO(SysDept domain) {
        if (domain == null) {
            return null;
        }
        SysDeptDTO dto = new SysDeptDTO();
        BeanUtils.copyProperties(domain, dto);
        
        // 转换子部门
        if (domain.getChildren() != null && !domain.getChildren().isEmpty()) {
            List<SysDeptDTO> childrenDTO = new ArrayList<>();
            for (SysDept child : domain.getChildren()) {
                childrenDTO.add(toDTO(child));
            }
            dto.setChildren(childrenDTO);
        }
        
        return dto;
    }

    /**
     * DTO转换为领域模型
     */
    public static SysDept toDomain(SysDeptDTO dto) {
        if (dto == null) {
            return null;
        }
        SysDept domain = new SysDept();
        BeanUtils.copyProperties(dto, domain);
        
        // 转换子部门
        if (dto.getChildren() != null && !dto.getChildren().isEmpty()) {
            List<SysDept> childrenDomain = new ArrayList<>();
            for (SysDeptDTO child : dto.getChildren()) {
                childrenDomain.add(toDomain(child));
            }
            domain.setChildren(childrenDomain);
        }
        
        return domain;
    }

    /**
     * 领域模型列表转换为DTO列表
     */
    public static List<SysDeptDTO> toDTOList(List<SysDept> domainList) {
        if (domainList == null || domainList.isEmpty()) {
            return new ArrayList<>();
        }
        List<SysDeptDTO> dtoList = new ArrayList<>();
        for (SysDept domain : domainList) {
            dtoList.add(toDTO(domain));
        }
        return dtoList;
    }

    /**
     * DTO列表转换为领域模型列表
     */
    public static List<SysDept> toDomainList(List<SysDeptDTO> dtoList) {
        if (dtoList == null || dtoList.isEmpty()) {
            return new ArrayList<>();
        }
        List<SysDept> domainList = new ArrayList<>();
        for (SysDeptDTO dto : dtoList) {
            domainList.add(toDomain(dto));
        }
        return domainList;
    }
}
